package com.itheima.user.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.behaviour.feign.ApBehaviourEntryFeign;
import com.itheima.behaviour.pojo.ApBehaviorEntry;
import com.itheima.common.pojo.Result;
import com.itheima.common.util.JwtUtil;
import com.itheima.common.util.Md5Util;
import com.itheima.user.dto.LoginDto;
import com.itheima.user.mapper.ApUserMapper;
import com.itheima.user.pojo.ApUser;
import com.itheima.user.service.ApUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * APP用户信息表 服务实现类
 * </p>
 *
 * @author 作者
 * @since 2021-08-20
 */
@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {

    @Autowired
    private ApUserMapper apUserMapper;

    @Autowired
    private ApBehaviourEntryFeign apBehaviourEntryFeign;

    /**
     * 登录
     *  1:游客
     *  2:会员
     * @param dto
     * @return
     */
    @Override
    public String login(LoginDto dto) {
        Map<String,Object> dataMap = new HashMap<String,Object>();
        //1.1:生成令牌，令牌中记录标记 flag=0
        dataMap.put("flag",dto.getFlag());
        //1.2:令牌的载荷信息包含客户端的机器设备号
        dataMap.put("equipmentId",dto.getEquipmentId());//机器号

        //1:游客登录
        if(dto.getFlag()==0){
            //1.3:检查用户信息是否记录到实体行为表中[ap_behavior_entry]，如果没有记录，则添加记录
            //检查游客信息是否记录到了App行为实体表中
            Result<ApBehaviorEntry> entryResult = apBehaviourEntryFeign.getByEquipmentIdOrUserId(dto.getEquipmentId(), null);
            if(entryResult.getData()==null){
                //如果没有记录，则添加记录
                ApBehaviorEntry entry = new ApBehaviorEntry();
                entry.setType(0); //设备对象
                entry.setEntryId(dto.getEquipmentId()); //机器号
                entry.setCreatedTime(LocalDateTime.now()); //创建时间
                apBehaviourEntryFeign.insert(entry);
            }
            return JwtUtil.create(dataMap);
        }

        //2:会员登录
        //2.1:根据用户名获取用户信息User
        QueryWrapper<ApUser> queryWrapper = new QueryWrapper<ApUser>();
        queryWrapper.eq("name",dto.getPhone());//默认是用户名
        ApUser user = apUserMapper.selectOne(queryWrapper);

        //2.2：校验密码->如何校验
        //2.2.1:pwd=MD5(dto中的密码+User.salt)
        String pwd = Md5Util.toMD5(dto.getPassword(),user.getSalt());
        //2.2.2:pwd匹配User.password
        if(pwd.equals(user.getPassword())){
            //检查游客信息是否记录到了App行为实体表中
            Result<ApBehaviorEntry> entryResult = apBehaviourEntryFeign.getByEquipmentIdOrUserId(null,user.getId());
            //如果没有记录，则添加到App行为实体表中
            if(entryResult.getData()==null){
                ApBehaviorEntry entry = new ApBehaviorEntry();
                entry.setType(1); //系统会员
                entry.setEntryId(user.getId()); //会员用户ID
                entry.setCreatedTime(LocalDateTime.now()); //创建时间
                apBehaviourEntryFeign.insert(entry);
            }

            //2.3:匹配通过，生成令牌
            user.setPassword("*");
            dataMap.putAll(JSON.parseObject(JSON.toJSONString(user),Map.class));
            //生成令牌
            return JwtUtil.create(dataMap);
        }
        //2.4:匹配失败,提示登录失败(返回NULL)
        return null;
    }
}
